package org.cnam.mobileShopping.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.cnam.mobileShopping.bean.Category;
import org.cnam.mobileShopping.bean.Product;
import org.cnam.mobileShopping.dao.DAO;
import org.cnam.mobileShopping.dao.DAOFactory;
import org.cnam.mobileShopping.dao.ProductDAO;
import org.cnam.mobileShopping.util.MobileShoppingUtils;
import org.cnam.mobileShopping.wsclient.WSClient;
import org.json.JSONException;

import android.content.Context;

/**
 * Controller sur les produits permettant de les retrouver, les sauvegarder et
 * ainsi de suite
 * 
 * @author laurent
 * 
 */
public class ProductController {

	private static DAO<Product> dao;

	// singletonnage
	static {
		dao = DAOFactory.getProductDAO(null);
	}

	/**
	 * Construit une map sous la forme de [{"aaa",1},{"bbb",2},...]
	 * 
	 * @param categories
	 *            La liste de catégories à formatter
	 * @return La map construite
	 */
	public static List<Map<String, Product>> buildMapProducts(
			List<Product> products) {
		// la map a retourner
		List<Map<String, Product>> toReturn = new ArrayList<Map<String, Product>>();
		// on parcourt toutes les listes
		for (Product p : products) {
			Map<String, Product> toAdd = new HashMap<String, Product>();
			toAdd.put("line1", p);
			toReturn.add(toAdd);
		}
		return toReturn;
	}

	/**
	 * Récupération de tous les produits appartenant à une catégorie
	 * 
	 * @param context
	 *            Le contexte de consultation de la base de données
	 * @param c
	 *            la category voulue
	 * @return la liste de tous les produits correspondant
	 */
	public static List<Product> getProductByCategory(Context context, Category c) {
		return ((ProductDAO) DAOFactory.getProductDAO(context))
				.getProductByCategory(c);

	}

	/**
	 * Récupération d'un produit par son code barre
	 * 
	 * @param barcode
	 *            Le code de barre du produit à retrouver
	 * @return le produit correspondant
	 */
	public static Product getProduct(Context context, String barcode) {
		Product p = ((ProductDAO) DAOFactory.getProductDAO(context))
				.findByBarcode(barcode);
		return p;
	}

	/**
	 * Récupération d'un produit par son id
	 * 
	 * @param context
	 *            Le contexte d'accès à la base de données
	 * @param id
	 *            L'id du code barre à récupérer
	 * @return le produit correspondant
	 */
	public static Product getProduct(Context context, Integer id) {
		return DAOFactory.getProductDAO(context).find(id);
	}

	/**
	 * Creation d'un produit.
	 * 
	 * @param obj
	 *            : un produit.
	 * @return le produit ainsi créé
	 */
	public static Product createProduct(Context context, Product obj) {
		Product p = null;
		try {
			// on l'envoie au webservices si on est connecte
			if (MobileShoppingUtils.isConnected(context)) {
				p = WSClient.getInstance().addProductInReferenciel(obj);
				// ajout en base locale
				DAOFactory.getProductDAO(context).create(p);
			}

		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return p;
	}

	/**
	 * Supression d'un produit.
	 * 
	 * @param obj
	 *            : un produit.
	 * @return true si la supression est ok.
	 */
	public static boolean deleteProduct(Product obj) {
		return (dao.delete(obj));
	}

	/**
	 * Mise à jours d'un produit.
	 * 
	 * @param obj
	 *            : un produit.
	 * @return true si la maj est ok.
	 */
	public static boolean updateProduct(Product obj) {
		return (dao.update(obj));
	}

	/**
	 * Retourne la liste des produits.
	 * 
	 * @return liste des produits
	 */
	public static List<Product> getAllProducts() {
		return (dao.findAll());
	}
}
